为群晖 Container Manager 配置代理
✨文章摘要(AI生成)
本文详细介绍了如何为群晖Container Manager配置代理,包括为apt设置代理、为Docker Daemon设置代理以及为Docker容器设置代理。文章首先提供了注意事项和背景知识,然后按照步骤详细解释了每个配置过程,包括相关的命令和配置文件内容。通过本文的指导,读者可以成功地为群晖Container Manager配置代理,并解决在使用过程中可能遇到的代理问题。
注意事项
- 本教程在全新的 Ubuntu 22.04 LTS 系统环境下通过测试
- 本教程在群晖 DSM 7.2 版本通过测试,假定具备 root 权限
- 假定你已有可以代理 HTTP 或 SOCKS 协议的端口:例如 192.168.31.5:10809
- 尽可能引用官方文档,本文主要针对需要代理的部分的设置
安装 Docker,为 apt 设置代理
群晖 Container Manager 用户可以跳过这一小节,你实际上已经有 Docker 了。
Docker Engine 安装过程请参考 官方文档。
Docker 官方给出了许多安装方式,我选择用 apt 从官方维护的源中安装。
你也可以选择手动下载二进制包,然后用 dpkg 安装.
这里选择使用 apt 演示,关键在于很多人还不清楚如何为 apt 设置代理。
sudo vi /etc/apt/apt.conf
Acquire::http::Proxy "http://192.168.31.5:10809";
Acquire::https::Proxy "http://192.168.31.5:10809";
注意第二个行依旧是 http 协议,否则会碰到 TLS Could not handshake 问题。 代理服务器只需要负责做请求转发和响应转发,不会像 HTTPS 协议一样进行解密和加密。
为 Docker Daemon 设置代理
安装完成后,官网教程会让你运行 docker run hello-world 来验证安装是否成功。
默认情况下,你的本地肯定不存在任何有关镜像(如下所示),因此会从官方库拉取:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Retrying in 1 second
docker: error pulling image configuration:
download failed after attempts=6: dial tcp 31.13.82.33:443: i/o timeout.
如果你已经成功运行了 hello-world 镜像,那么请跳过这一小节。执行拉取操作的是 Docker Daemon ,参考 官方文档 进行 Proxy 有关的设置。
对于 Docker 引擎 23.0 及更高版本
提示
使用 docker info
可以查询到版本信息,版本太低的话请参考下一节的方法。
Docker Daemon 大多数配置选项都可根据 daemon.json
文件进行设置。
对于 Docker 引擎 23.0 及更高版本,可以在该文件中设置代理行为:
- Root 模式:
/etc/docker/daemon.json
- Rootless 模式:
~/.config/docker/daemon.json
- 群晖 Container Manager:
/var/packages/ContainerManager/etc/docker.json
{
"proxies": {
"http-proxy": "http://192.168.31.5:10809",
"https-proxy": "http://192.168.31.5:10809",
"no-proxy": "127.0.0.0/8"
}
}
这些配置将覆盖 docker.service
默认的 systemd 设定。
如果您位于 HTTP 或 HTTPS 代理服务器后面,例如在公司设置中, 则必须在 systemd 服务文件中指定守护程序代理配置,而不是在 daemon.json
文件中或使用环境变量。
较为通用的 systemd 设置方法
如 Docker 版本太低,不支持通过 daemon.json
配置代理,则需手动创建 systemd 文件:
- Root 模式:
/etc/systemd/system/docker.service.d
- Rootless 模式:
~/.config/systemd/user/docker.service.d
- 群晖:
/etc/systemd/system/pkg-ContainerManager-dockerd.service.d
添加 http-proxy.conf 文件,下面以群晖 Container Manager 为例:
sudo mkdir -p /etc/systemd/system/pkg-ContainerManager-dockerd.service.d
sudo vi /etc/systemd/system/pkg-ContainerManager-dockerd.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.31.5:10809"
Environment="HTTPS_PROXY=http://192.168.31.5:10809"
Environment="NO_PROXY=localhost,127.0.0.1"
如果你有内建的 registry-mirrors, 记得加入 NO_PROXY 中。
重启 Docker Daemon
不论采用上面哪种方式,都需要重启 Docker Daemon 服务:
- 如果是旧版本群晖(6.0+),要用
synoservice
代替systemctl
- 如果是 rootless 模式,要用
systemctl --user
代替sudo systemctl
下面仅仅给出 root 模式和群晖 Container Manager 的重启方法:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl restart pkg-ContainerManager-dockerd.service
重启 Docker/Conatiner Manager 服务需要一定的时间,取决于你正在运行的容器数量。
检查设置是否生效:
sudo systemctl show --property=Environment docker
systemctl show --property=Environment pkg-ContainerManager-dockerd.service
再次跑 docker run hello-world
,应该就能成功了。
为 Docker 容器设置代理
有的时候,你使用的 Docker 镜像在 build 和 run 时也需要代理。 大部分应该都知道怎么配置,或者会通过环境变量来设置。 但有的时候希望代理配置默认对所有容器生效(那为什么不用机器或路由级别的代理呢),可以参考下面的方法。
参考 官方文档 中的说明,你可以在 ~/.docker/config.json
中设置代理。
{
"proxies": {
"default": {
"httpProxy": "http://192.168.31.5:10809",
"httpsProxy": "http://192.168.31.5:10809",
"noProxy": "127.0.0.0/8"
}
}
}
保存文件后配置将生效,适用于新容器的生成和运行,无需重启 Docker,
本质上,它通过影响 Docker CLI 来添加环境变量,效果类似于:
docker build --build-arg HTTP_PROXY="http://192.168.31.5:10809" .
docker run --env HTTP_PROXY="http://192.168.31.5:10809" redis
但一般还是建议单独针对需要代理服务的容器手动设置这些环境变量, 同样地,一些 Docker 内的应用是不按照环境变量来设置代理的,需要手动配置,需要额外注意。 折腾了这么多,是不是还是觉得旁路由+规则代理的方法会更加简单呢?这就看个人需求了。